package tt.dz.egobus.servicemanager.service;

import tt.dz.egobus.api.ResponseBack;
import tt.dz.egobus.api.exception.ResponseException;
import tt.dz.egobus.api.managerservice.manager.*;
import tt.dz.egobus.bean.Pagination;
import tt.dz.egobus.servicemanager.business.point.BusPoint;
import tt.dz.egobus.servicemanager.entities.BusinessServiceInfo;
import tt.dz.egobus.servicemanager.vo.BusinessRequestVo;

import java.util.List;

/**
 * @author Anson
 * @date 17-8-9
 * @name 抢单模式下管理服务
 * @since 1.0.6
 */
public interface GrabManagerService extends ManagerService {

    /**
     * @param busId
     * @param driverId
     * @author Anson
     * @date 17-3-21
     * @name 激活司机
     * 校验用户有效性
     * 校验车辆的有效性以及状态有效性
     * 新增业务:添加预约日期队列
     * @since 1.0.2
     */
    @Override
    ResponseBack<Boolean> active(String busId, String driverId);

    /**
     * @param driverId   当前司机的id
     * @param businessId 当前业务请求id
     * @return 返回是否抢单成功
     * ${@linkplain ResponseBack#getResult()} true：b绑定成功,false：绑定失败
     * @throws ResponseException 请求或者driver主键查询为空
     * @author Anson
     * @date 17-3-24
     * @name 司机接受进行某个抢单
     * 若当前抢单成功,则会进行一下处理
     * 司机当前 状态从抢单-->开始
     * 当前业务逻辑会校验当前司机的相关状态以及是否存在有效的绑定关系等等
     * 推送当前业务到用户端
     * @since 1.0.6
     */
    ResponseBack<Boolean> driverGrabAcceptAndBeginTask(String driverId, String businessId);

    /**
     * @param driverId          司机id
     * @param businessId        业务请求id
     * @param busPoint          当前司机接受派单坐标地址
     * @param businessRequestVo 业务请求vo
     * @throws ResponseException 司机绑定的状态异常的时候
     * @author Anson
     * @date 17-3-27
     * @name 抢单模式 -> 业务抢单开始
     * @since 1.0.6
     */
    ResponseBack<Boolean> doGrabBusiness(String driverId, String businessId, String userId, BusPoint busPoint,
                                         BusinessRequestVo businessRequestVo);

    /**
     * @param businessId 业务请求id
     * @author Anson
     * @date 17-8-9
     * @name 判断当前业务抢单流程是否存活 ,即状态必须存在抢单中
     * @since 1.0.6
     */
    ResponseBack<Boolean> businessGrabIsLive(String businessId);

    /**
     * @param businessId 业务请求id
     * @author Anson
     * @date 17-8-9
     * @name 判断当前业务抢单流程是否抢单超时 ,即状态必须存在抢单中
     * @since 1.0.6
     */
    ResponseBack<Boolean> businessGrabTimeout(String businessId);

    /**
     * @param businessId 业务请求id
     * @author Anson
     * @date 17-8-9
     * @name 判断当前业务抢单流程是否整个流程是否结束 , 即存在用户终止,派单超时,正常抢单结束
     * @since 1.0.6
     */
    ResponseBack<Boolean> businessGrabFinish(String businessId);

    /**
     * @param businessId
     * @author Anson
     * @date 17-8-10
     * @name 处理当前抢单流单业务逻辑
     * @since 1.0.6
     */
    ResponseBack<Boolean> doGrabLost(String businessId);

    /**
     * @param businessId
     * @author Anson
     * @date 17-8-10
     * @name 处理当前抢单超时业务逻辑
     * @since 1.0.6
     */
    ResponseBack<Boolean> doGrabTimeout(String businessId);

    /**
     * @param businessId
     * @author Anson
     * @date 17-9-9
     * @name 推单给用户端, 有有用户端进行司机分发推单
     * @since 1.0.7
     */
    void pushBusinessHandler(String businessId);

    /**
     * @param userId     用户id
     * @param businessId 业务id
     * @return 返回当前抢单的数据
     * @author Anson
     * @date 17-8-7
     * @name 用户取消抢单流程
     * @desc 用户在未接收到真正订单时候, 可取消当前抢单流程
     * @since 1.0.6
     */
    ResponseBack<DistributeDriverTask> userCancelGrabBusiness(String userId, String businessId);

    /**
     * @param businessId 当前业务编号
     * @author Anson
     * @date 17-8-15
     * @name 终止当前业务定时任务
     * @since 1.0.6
     */
    ResponseBack<Boolean> terminalDynamicTask(String businessId);

    /**
     * @param orderId 当前订单id
     * @throws ResponseException 业务流水号查询为空
     * @author Anson
     * @date 17-05-15
     * @name 获取当前有效的拍单视图信息
     * 若当前业务[isValidate]逻辑删除状态为false,则返回结果result数据中为null
     * 若当前没有业务对应这个订单,则返回结果result数据中为null
     * @since 1.0.6
     */
    ResponseBack<BusinessView> getBusinessViewByOrder(String orderId);

    /**
     * @param businessId 业务流水号
     * @author Anson
     * @date 17-8-15
     * @name 获取抢单模式下的业务缓存
     * 在业务结束时候,获取不到的
     * @since 1.0.6
     */
    ResponseBack<DistributeDriverTask> getGrabBusinessDistributeDriverTask(String businessId);

    /**
     * @param driverId   司机id
     * @param businessId 司机放弃的业务号
     * @throws ResponseException 业务流水号或者driver主键查询为空
     * @author Anson
     * @date 17-3-24
     * @name 司机放弃抢单流程
     * 将司机的状态从抢单中转变到激活中的状态
     * @since 1.0.6
     */
    ResponseBack<Boolean> driverGiveUpGrabTask(String driverId, String businessId) throws ResponseException;

    /**
     * @param busPoints  当前司机队列
     * @param businessId
     * @author Anson
     * @date 17-8-16
     * @name 修改当前司机队列为抢单队列
     * @since 1.0.6
     */
    ResponseBack<Boolean> handlerDriversGrabStatus(BusPoint[] busPoints, String businessId);


    /**
     * @param driverId   当前司机队列
     * @param businessId
     * @author Anson
     * @date 17-8-16
     * @name 修改当前司机为抢单队列
     * @since 1.0.6
     */
    ResponseBack<Boolean> handlerDriversGrabStatus(String driverId, String businessId);

    /**
     * @param businessIds 当前业务流水号数据集合
     * @throws ResponseException 业务流水号查询为空
     * @author Anson
     * @date 17-3-28
     * @name 获取当前有效的拍单视图信息
     * 若当前业务[isValidate]逻辑删除状态为false,则返回null
     * @since 1.0.7
     */
    BusinessView[] getServiceViewByBusinessIds(String[] businessIds);

    /**
     * 当前业务计算限制状态
     *
     * @param businessId 业务流水号
     * @author Jack
     * @date 2017/8/30
     * @name
     * @since 1.0.7
     */
    BusinessBaseLimitStatus accBusinessStatus(String businessId);

    /**
     * @param info
     * @author Anson
     * @date 17-8-31
     * @name 根据业务详细信息, 转换为当前基本限制信息
     * @since 1.0.7
     */
    BusinessBaseLimitStatus getInnerLimitStatus(BusinessServiceInfo info);

    /**
     * @param driverId   当前司机
     * @param businessId 当前业务号
     * @author Anson
     * @date 17-8-30
     * @name 司机某一个预约单开始向预约地行驶
     * @since 1.0.7
     */
    ResponseBack<Boolean> bespeakToBusiness(String driverId, String businessId);

    /**
     * @param userId                                当前请求人id
     * @param businessId                            当前业务号
     * @param bespeakUserCancelValidateLimitSeconds 当前可取消预约有效时间段的秒数
     * @author Anson
     * @date 17-8-30
     * @name 用户取消预约单
     * @since 1.0.7
     */
    ResponseBack<Boolean> bespeakCancel(String userId, String businessId, Long bespeakUserCancelValidateLimitSeconds);

    /**
     * @param driverId
     * @param businessId
     * @author Anson
     * @date 17-8-31
     * @name 司机取消行程
     * @since 1.0.7
     */
    ResponseBack<Boolean> driverCancelBusiness(String driverId, String businessId);

    /**
     * @param info 用户请求参数info
     * @author Jack
     * @date 2017/8/31
     * @name 更改业务订单状态
     * @since 1.0.7
     */
    ResponseBack<Boolean> modifyBusinessOrderInfo(OrderSimpleInfo info);

    /**
     * @param info 用户请求参数info
     * @author Anson
     * @date 17-8-31
     * @name info转换businessvo
     * @since 1.0.7
     */
    BusinessVo convertInfoToBusinessVo(BusinessServiceInfo info);

    /**
     * @param requestType
     * @author Anson
     * @date 17-9-1
     * @name 根据服务类型请求服务说明
     * @since 1.0.7
     */
    ResponseBack<List<BusinessCodeServiceStatus>> getServiceByRequestType(UserRequestTypeInfo.UserRequestType
                                                                                  requestType);


    /**
     * 分页查询业务详情信息
     *
     * @param vo 分页查询参数
     * @author Jack
     * @date 2017/9/1
     * @name
     * @since 1.0.7
     */
    ResponseBack<Pagination<BusinessServiceInfoVo>> queryBusinessInfoByPage(PageVo vo);

    /**
     * @param businessId 当前业务流水号
     * @author Jack
     * @date 2017/9/13
     * @name 查询当前业务在抢单中的业务状态
     * @since 1.0.7
     */
    ResponseBack<EnableGrabBusinessStatus> queryEnableGrabBusinessStatus(String businessId);

    /**
     * @param businessId 当前业务流水号
     * @author Jack
     * @date 2017/9/13
     * @name 查询当前业务在抢单中的缓存业务
     * @since 1.0.7
     */
    ResponseBack<BusinessCacheVo> queryEnableGrabBusinessCache(String businessId);
}
